home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / etc / hotplug / input.agent < prev    next >
Text File  |  2006-05-01  |  7KB  |  313 lines

  1. #!/bin/sh
  2. #
  3. # input-specific hotplug policy agent.
  4. #
  5. # This should handle 2.6.* input hotplugging,
  6. # with a consistent framework for adding device and driver
  7. # specific handling.
  8. #
  9. # Normally, adding a input device will modprobe handler(s) for
  10. # this device.
  11. #
  12. # Kernel input hotplug params include (not all of them may be available):
  13. #    
  14. #    ACTION=%s [add or remove]
  15. #    PRODUCT=%x/%x/%x/%x
  16. #    NAME=%s
  17. #    PHYS=%s
  18. #    EV=%lx
  19. #    KEY=%lx %lx ...
  20. #    REL=%lx
  21. #    ABS=%lx %lx ...
  22. #    MSC=%lx
  23. #    LED=%lx
  24. #    SND=%lx
  25. #    FF=%lx %lx ...
  26. #
  27. # HISTORY:
  28. #
  29. # 30-Jul-2003    initial version
  30. #
  31.  
  32. cd /etc/hotplug
  33. . ./hotplug.functions
  34. # DEBUG=yes export DEBUG
  35.  
  36. # generated by module-init-tools
  37. MAP_CURRENT=$MODULE_DIR/modules.inputmap
  38.  
  39. # accumulates list of modules we may care about
  40. DRIVERS=""
  41.  
  42. if [ "$ACTION" = "" ]; then
  43.     mesg Bad INPUT agent invocation, no action
  44.     exit 1
  45. fi
  46.  
  47. # we can't "unset IFS" on bash1, so save a copy
  48. DEFAULT_IFS="$IFS"
  49.  
  50. #
  51. # Each modules.inputmap format line corresponds to one entry in a
  52. # MODULE_DEVICE_TABLE(input,...) declaration in a kernel file.
  53. #
  54. matchBits=0; i_bustype=0; i_vendor=0; i_product=0; i_version=0; i_evBits=0
  55.  
  56. input_join_words ()
  57. {
  58.     name="$1"
  59.     array="$2"
  60.  
  61.     if [ "$array" = '' ]; then
  62.     return
  63.     fi
  64.  
  65.     set $array
  66.  
  67.     tmp="$1"
  68.     shift
  69.     while [ "$#" -gt 0 ]; do
  70.     tmp="$tmp:$1"
  71.     shift
  72.     done
  73.  
  74.     eval "$name=\"$tmp\""
  75. }
  76.  
  77. input_convert_vars ()
  78. {
  79.     if [ "$PRODUCT" != "" ]; then
  80.     IFS=/
  81.     set $PRODUCT ''
  82.     IFS="$DEFAULT_IFS"
  83.     i_bustype=$((0x$1))
  84.     i_vendor=$((0x$2))
  85.     i_product=$((0x$3))
  86.     i_version=$((0x$4))
  87.     fi
  88.  
  89.     if [ "$EV" != "" ]; then
  90.     i_evBits=$((0x$EV))
  91.     fi
  92.  
  93.     input_join_words i_keyBits "$KEY"
  94.     input_join_words i_relBits "$REL"
  95.     input_join_words i_absBits "$ABS"
  96.     input_join_words i_mscBits "$MSC"
  97.     input_join_words i_ledBits "$LED"
  98.     input_join_words i_sndBits "$SND"
  99.     input_join_words i_ffBits  "$FF"
  100. }
  101.  
  102. INPUT_DEVICE_ID_MATCH_BUS=1
  103. INPUT_DEVICE_ID_MATCH_VENDOR=2
  104. INPUT_DEVICE_ID_MATCH_PRODUCT=4
  105. INPUT_DEVICE_ID_MATCH_VERSION=8
  106. INPUT_DEVICE_ID_MATCH_EVBIT=$((0x010))
  107. INPUT_DEVICE_ID_MATCH_KEYBIT=$((0x020))
  108. INPUT_DEVICE_ID_MATCH_RELBIT=$((0x040))
  109. INPUT_DEVICE_ID_MATCH_ABSBIT=$((0x080))
  110. INPUT_DEVICE_ID_MATCH_MSCBIT=$((0x100))
  111. INPUT_DEVICE_ID_MATCH_LEDBIT=$((0x200))
  112. INPUT_DEVICE_ID_MATCH_SNDBIT=$((0x400))
  113. INPUT_DEVICE_ID_MATCH_FFBIT=$((0x800))
  114.  
  115.  
  116. input_match_bits ()
  117. {
  118.     mod_bits=$1
  119.     dev_bits=$2
  120.  
  121.     if [ "$dev_bits" = "" ]; then
  122.     return 0
  123.     fi
  124.     mword=$((0x${mod_bits##*:}))
  125.     dword=$((0x${dev_bits##*:}))
  126.  
  127.     while true; do
  128.     if [ $(( $mword & $dword != $mword )) -eq 1 ]; then
  129.         return 1
  130.     fi
  131.  
  132.     mod_bits=${mod_bits%:*}
  133.     dev_bits=${dev_bits%:*}
  134.  
  135.     case "$mod_bits-$dev_bits" in
  136.         *:*-*:* )
  137.         : continue
  138.         ;;
  139.         *:*-*|*-*:* )
  140.         return 0
  141.         ;;
  142.         * )
  143.         return 1
  144.         ;;
  145.     esac
  146.     done
  147. }
  148.  
  149. #
  150. # stdin is "modules.inputmap" syntax
  151. # on return, all matching modules were added to $DRIVERS
  152. #
  153. input_map_modules ()
  154. {
  155.     while read line
  156.     do
  157.         # comments are lines that start with "#" ...
  158.     # be careful, they still get parsed by bash!
  159.     case "$line" in
  160.     \#*) continue ;;
  161.     esac
  162.  
  163.     set $line
  164.  
  165.     module="$1"
  166.     matchBits=$(($2))
  167.  
  168.     bustype=$(($3))
  169.     vendor=$(($4))
  170.     product=$(($5))
  171.     version=$(($6))
  172.  
  173.     evBits="$7"
  174.     keyBits="$8"
  175.     relBits="$9"
  176.  
  177.     shift 9
  178.     absBits="$1"
  179.     cbsBits="$2"
  180.     ledBits="$3"
  181.     sndBits="$4"
  182.     ffBits="$5"
  183.     driverInfo=$(($6))
  184.  
  185.     : checkmatch $module
  186.  
  187.     : bustype $bustype $i_bustype
  188.         if [ $INPUT_DEVICE_ID_MATCH_BUS -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_BUS )) ] && 
  189.        [ $bustype -ne $i_bustype ]; then
  190.         continue
  191.     fi
  192.  
  193.     : vendor $vendor $i_vendor
  194.         if [ $INPUT_DEVICE_ID_MATCH_VENDOR -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_VENDOR )) ] && 
  195.        [ $vendor -ne $i_vendor ]; then
  196.         continue
  197.     fi
  198.  
  199.     : product $product $i_product
  200.         if [ $INPUT_DEVICE_ID_MATCH_PRODUCT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_PRODUCT )) ] && 
  201.        [ $product -ne $i_product ]; then
  202.         continue
  203.     fi
  204.  
  205.     # version i_version $i_version < version $version
  206.         if [ $INPUT_DEVICE_ID_MATCH_VERSION -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_VERSION )) ] && 
  207.        [ $version -ge $i_version ]; then
  208.         continue
  209.     fi
  210.  
  211.     : evBits $evBits $i_evBits
  212.         if [ $INPUT_DEVICE_ID_MATCH_EVBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_EVBIT )) ] && 
  213.        input_match_bits "$evBits" "$i_evBits"; then
  214.         continue
  215.     fi
  216.     : keyBits $keyBits $i_keyBits
  217.         if [ $INPUT_DEVICE_ID_MATCH_KEYBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_KEYBIT )) ] && 
  218.        input_match_bits "$keyBits" "$i_keyBits"; then
  219.         continue
  220.     fi
  221.     : relBits $relBits $i_relBits
  222.         if [ $INPUT_DEVICE_ID_MATCH_RELBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_RELBIT )) ] && 
  223.        input_match_bits "$relBits" "$i_relBits"; then
  224.         continue
  225.     fi
  226.  
  227.     : absBits $absBits $i_absBits
  228.         if [ $INPUT_DEVICE_ID_MATCH_ABSBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_ABSBIT )) ] && 
  229.        input_match_bits "$absBits" "$i_absBits"; then
  230.         continue
  231.     fi
  232.  
  233.     : mscBits $mscBits $i_mscBits
  234.         if [ $INPUT_DEVICE_ID_MATCH_MSCBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_MSCBIT )) ] && 
  235.        input_match_bits "$mscBits" "$i_mscBits"; then
  236.         continue
  237.     fi
  238.  
  239.     : ledBits $ledBits $_ledBits
  240.         if [ $INPUT_DEVICE_ID_MATCH_LEDBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_LEDBIT )) ] && 
  241.        input_match_bits "$ledBits" "$i_ledBits"; then
  242.         continue
  243.     fi
  244.  
  245.     : sndBits $sndBits $i_sndBits
  246.         if [ $INPUT_DEVICE_ID_MATCH_SNDBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_SNDBIT )) ] && 
  247.        input_match_bits "$sndBits" "$i_sndBits"; then
  248.         continue
  249.     fi
  250.  
  251.     : ffBits $ffBits $i_ffBits
  252.         if [ $INPUT_DEVICE_ID_MATCH_FFBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_FFBIT )) ] && 
  253.        input_match_bits "$ffBits" "$i_ffBits"; then
  254.         continue
  255.     fi
  256.  
  257.     : driverInfo $driverInfo
  258.     if [ $matchBits -eq 0 ] && [ $driverInfo -eq 0 ]; then
  259.         continue
  260.     fi
  261.  
  262.     # It was a match!
  263.     case " $DRIVERS " in
  264.         *" $module "* )
  265.         : already found
  266.         ;;
  267.         * )
  268.         DRIVERS="$module $DRIVERS"
  269.         ;;
  270.     esac
  271.     : drivers $DRIVERS
  272.     done
  273. }
  274.  
  275. #
  276. # What to do with this INPUT hotplug event?
  277. #
  278. case $ACTION in
  279.  
  280. add)
  281.  
  282.     input_convert_vars
  283.  
  284.     FOUND=false
  285.     LABEL="INPUT product $PRODUCT"
  286.  
  287.     if [ -r $MAP_CURRENT ]; then
  288.     load_drivers input $MAP_CURRENT "$LABEL"
  289.     fi
  290.  
  291.     if [ "$DRIVERS" != "" ]; then
  292.     FOUND=true
  293.     fi
  294.  
  295.     if [ "$FOUND" = "false" ]; then
  296.     debug_mesg "... no modules for $LABEL"
  297.     exit 2
  298.     fi
  299.  
  300.     ;;
  301.  
  302. remove)
  303.     : nothing so far
  304.  
  305.     ;;
  306.  
  307. *)
  308.     debug_mesg INPUT $ACTION event not supported
  309.     exit 1
  310.     ;;
  311.  
  312. esac
  313.